package pl.wroc.pwr.docs.repos.embedded.server;

import java.net.BindException;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.eclipse.jetty.util.log.Log;

/**
 * Obsługa argumentów lini poleceń.
 * Wystartowanie web serwera.
 */
public class Launcher {

	public static void main(String[] args) {
		CommandLineParser parser = new PosixParser();
		Options opt = new Options();

		opt.addOption("l", "localhost", false, "przyjmuj połączenia tylko z localhost"); // TODO
		opt.addOption("p", "port", true, "uruchom serwer na tym porcie");
		opt.addOption("d", "db", true, "nazwy pliku z baza danych");
		opt.addOption("g", "gui", false, "uruchom gui"); // TODO
		opt.addOption("c", "cmd", false, "uruchom w lini poleceń");
		opt.addOption("L", "log", false, "pokazuj logi");
		opt.addOption("v", "version", false, "pokaż wersję");
		opt.addOption("h", "help", false, "pomoc");

		try {
			CommandLine line = parser.parse(opt, args);

			if(line.getOptions().length == 0 || line.hasOption("g")){
				new GuiLauncher();
				System.exit(0);
			}

			if (line.hasOption("v")) {
				// TODO fajnie jakby dodać datę builda
				String version = "Repozytorium dokumentów - 0.1";

				System.out.println(version);
				System.exit(0);
			}

			if (line.hasOption("h")) {
				HelpFormatter formatter = new HelpFormatter();

				formatter.setSyntaxPrefix("");
				formatter.setLongOptPrefix("  --");
				formatter.printHelp("Repozytorium dokumentów:", opt);
				System.exit(0);
			}

			if(!line.hasOption("L")){
				// TODO to nie dziala :/
				Log.setLog(null);
			}
			
			if(line.hasOption("p")){
				try {
					int port = Integer.parseInt(line.getOptionValue("p"));
					WebServer.setPort(port);
				} catch(NumberFormatException e){
					System.out.println("Błąd przy parsowaniu numeru portu: " + e.getMessage());
					System.exit(0);
				}	
			}
			
			if(line.hasOption("d")){
				String filepath = line.getOptionValue("d");
				WebServer.setDatabase(filepath);
			}
			
			try { 
				WebServer.get().start(); 
			} catch(Exception e) { 
				if(e instanceof BindException){
					System.out.println("Port " + WebServer.getPort() + " jest już zajęty.");
					System.exit(0);
				}
				else{
					throw new RuntimeException(e);
				}
			}
			
		} catch (ParseException e) {
			// np. przy podaniu nieistniejącej opcji
			System.out.println("Błąd przy parsowaniu argumentów lini poleceń: " + e.getMessage());
		}
	}
}